메인 콘텐츠로 이동하기
  1. 블로그 글/

머신 러닝 - 그리드 서치(Grid Search)

머신러닝에서 모델의 최적의 파라미터를 찾기 위한 효율적인 방법 중 하나는 그리드 서치(Grid Search)입니다. 본 글에서는 그리드 서치가 무엇이며, 어떻게 작동하는지, 그리고 언제 사용해야 하는지에 대해 설명합니다.

그리드 서치란? #

그리드 서치는 머신러닝 모델의 하이퍼파라미터를 최적화하기 위한 방법 중 하나입니다. 이 방법은 지정된 하이퍼파라미터의 모든 조합을 시험해보며, 가장 좋은 성능을 내는 파라미터 조합을 찾습니다. 각각의 파라미터 조합에 대해 교차 검증을 수행하여 모델의 성능을 평가하며, 이 과정을 통해 최적의 모델을 선택할 수 있습니다.

작동 원리 #

그리드 서치는 먼저 사용자가 지정한 하이퍼파라미터의 범위나 리스트를 입력 받습니다. 예를 들어, 결정 트리 분류기에 대한 그리드 서치를 수행한다고 가정해봅시다. 사용자는 트리의 깊이(depth), 분할을 위한 최소 샘플 수(min_samples_split) 등의 하이퍼파라미터 범위를 설정합니다. 그리드 서치는 이 범위 내의 모든 가능한 조합에 대해 모델을 학습시키고, 교차 검증을 사용하여 각 조합의 성능을 평가합니다. 성능 평가 방법으로는 보통 정확도, 정밀도, 재현율, F1 점수 등이 사용됩니다. 평가가 끝난 후, 가장 성능이 좋은 파라미터 조합이 선택됩니다.

장점과 단점 #

장점:

  • 사용하기 쉽고 이해하기 쉬움
  • 모든 가능한 조합을 탐색하기 때문에 최적의 조합을 찾을 가능성이 높음

단점:

  • 계산 비용이 매우 높음. 파라미터의 수와 범위가 커질수록 필요한 계산량이 기하급수적으로 증가
  • 최적의 조합을 찾는데 시간이 오래 걸림

사용 용도 #

그리드 서치는 파라미터의 범위가 상대적으로 작고, 모델의 학습 시간이 짧은 경우에 적합합니다. 또한, 최적의 하이퍼파라미터 조합을 찾는 것이 중요하고, 계산 자원이 충분한 경우에 사용하는 것이 좋습니다. 그러나 파라미터 공간이 매우 크거나, 학습 시간이 매우 긴 모델의 경우 랜덤 서치(Random Search), 베이지안 최적화 같은 다른 하이퍼파라미터 최적화 기법을 고려하는 것이 좋습니다.

GridSearchCV #

GridSearchCV는 사이킷런(sklearn) 라이브러리의 모델 선택 모듈에 포함된 클래스로, 주어진 모델의 하이퍼파라미터 공간을 교차 검증을 통해 탐색하며 최적의 파라미터를 찾는 데 사용됩니다. 이 클래스의 생성자에 전달할 수 있는 주요 파라미터는 다음과 같습니다:

주요 파라미터 설명 #

  1. estimator: 최적화할 모델. 예를 들어, RandomForestClassifier(), SVC() 등 사이킷런의 추정기(estimator) 객체가 될 수 있습니다.
  2. param_grid: 탐색할 파라미터의 딕셔너리. 예를 들어, {’n_estimators’: [100, 200], ‘max_features’: [‘auto’, ‘sqrt’]}과 같이 설정할 수 있으며, 이는 n_estimators와 max_features 파라미터에 대해 각각 [100, 200]과 [‘auto’, ‘sqrt’]의 값을 탐색하라는 의미입니다.
  3. scoring: 모델의 성능을 평가할 기준. 문자열로 지정되며, 예를 들어 ‘accuracy’, ‘f1’ 등이 사용될 수 있습니다. 사이킷런에서 사전 정의된 다른 scoring 옵션을 사용할 수도 있습니다.
  4. cv: 교차 검증 분할 전략. 예를 들어, 5는 5-폴드 교차 검증을 의미합니다. KFold, StratifiedKFold 등의 사이킷런의 분할기(splitter) 객체를 직접 전달할 수도 있습니다.
  5. refit: 최적의 파라미터를 찾은 후, 전체 데이터셋에 대해 모델을 다시 학습시킬지 여부를 결정합니다. 기본값은 True로, 최적의 파라미터로 전체 데이터셋에 대해 모델을 학습시킵니다.

GridSearchCV 구현 #

다음은 Scikit-learn의 GridSearchCV를 사용하여 분류기의 최적의 하이퍼파라미터를 찾는 간단한 예제입니다. 여기서는 결정 트리 분류기(DecisionTreeClassifier)를 사용합니다.

>>> from sklearn.model_selection import GridSearchCV
>>> from sklearn.tree import DecisionTreeClassifier
>>> from sklearn.datasets import load_iris
>>> from sklearn.model_selection import train_test_split

# 데이터 로드
>>> iris = load_iris()
>>> X = iris.data
>>> y = iris.target

# 훈련 세트와 테스트 세트 분리
>>> X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 모델 설정
>>> estimator = DecisionTreeClassifier()

# 탐색할 파라미터 그리드 설정
>>> param_grid = {
    	'max_depth': [None, 2, 4, 6, 8],
    	'min_samples_split': [2, 5, 10],
    	'min_samples_leaf': [1, 2, 4]
	}

# GridSearchCV 설정
>>> grid_search = GridSearchCV(estimator=estimator, param_grid=param_grid, scoring='accuracy', cv=5, refit=True)

# 그리드 서치 수행
>>> grid_search.fit(X_train, y_train)

# 최적 파라미터와 최고 점수 출력
>>> print("Best parameters:", grid_search.best_params_)
>>> print("Best score:", grid_search.best_score_)

# 테스트 데이터로 성능 평가
>>> test_accuracy = grid_search.score(X_test, y_test)
>>> print("Test accuracy:", test_accuracy)